package br.com.controleVendas.controller;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.primefaces.context.RequestContext;

import br.com.controleVendas.config.HibernateUtil;
import br.com.controleVendas.dao.ClienteDao;
import br.com.controleVendas.entity.Cidade;
import br.com.controleVendas.entity.CidadeDto;
import br.com.controleVendas.entity.ClienteDto;
import br.com.controleVendas.entity.Estado;
import br.com.controleVendas.entity.EstadoDto;

@ManagedBean(name = "clienteCtrl")
@ViewScoped
public class ClienteController
{

    List<ClienteDto>   list = new ArrayList<>();

    private ClienteDto cliente;

    ClienteDao         dao  = null;

    public ClienteController() throws Exception
    {
        dao = HibernateUtil.getInstance().getClienteDao();

        novo();

        atualizaListagem();
        
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Atualizado com Sucesso!","Atualizado com Sucesso!"));
    }

    public void novo()
    {
        this.cliente = new ClienteDto();
        this.cliente.setEstado(new Estado());
        this.cliente.setCidade(new Cidade());
        this.cliente.setFlAtivo(true);
    }

    public void atualizaListagem()
        throws Exception
    {
        list = dao.getList(new ClienteDto());
    }

    public void setVisualizar(ClienteDto cliente)
        throws Exception
    {
        ClienteDto filtro = new ClienteDto();
        filtro.setCdId(cliente.getCdId());
        this.cliente = dao.getOne(filtro);
        
        if(this.cliente.getEstado() == null)
            this.cliente.setEstado(new Estado());
        if(this.cliente.getCidade() == null)
            this.cliente.setCidade(new CidadeDto());
    }

    public void setEditar(ClienteDto cliente)
        throws Exception
    {
        ClienteDto filtro = new ClienteDto();
        filtro.setCdId(cliente.getCdId());
        this.cliente = dao.getOne(filtro);

        if(this.cliente.getEstado() == null)
            this.cliente.setEstado(new Estado());
        if(this.cliente.getCidade() == null)
            this.cliente.setCidade(new CidadeDto());
    }

    public List<SelectItem> getSelectItemEstado()
        throws Exception
    {
        List<SelectItem> result = new ArrayList<SelectItem>();
        result.add(new SelectItem(null, "Selecione..."));

        for(EstadoDto estadoDto : HibernateUtil.getInstance().getEstadoDao().getList(new EstadoDto()))
            result.add(new SelectItem(estadoDto.getCdId(), estadoDto.getNmEstado() + " - " + estadoDto.getNmSigla()));

        return result;
    }

    public List<SelectItem> getSelectItemCidade()
        throws Exception
    {
        List<SelectItem> result = new ArrayList<SelectItem>();
        result.add(new SelectItem(null, "Selecione..."));
        if(cliente.getEstado().getCdId() != null && cliente.getEstado().getCdId() > 0L)
        {
            CidadeDto filtro = new CidadeDto();
            filtro.setListCriterion(new ArrayList<Criterion>());
            filtro.getListCriterion().add(Restrictions.eq("estado.cdId", cliente.getEstado().getCdId()));

            for(CidadeDto cidadeDto : HibernateUtil.getInstance().getCidadeDao().getList(filtro))
                result.add(new SelectItem(cidadeDto.getCdId(), cidadeDto.getNmCidade()));
        }
        return result;
    }

    public void setAlterarStatus(ClienteDto cliente)
    {
        try
        {
            cliente.setFlAtivo(!cliente.getFlAtivo());
            dao.salvar(cliente);
            atualizaListagem();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

    public void salvar(ActionEvent event)
    {
        try
        {

            if(cliente.getEstado().getCdId() == null || cliente.getEstado().getCdId() <= 0L)
            {
                cliente.setEstado(null);
                cliente.setCidade(null);
            }
            else if(cliente.getCidade().getCdId() == null || cliente.getCidade().getCdId() <= 0L)
                cliente.setCidade(null);

            cliente = dao.salvar(cliente);
            setEditar(cliente);
            list = dao.getList(new ClienteDto());
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        FacesContext.getCurrentInstance().addMessage(":formMsgs:growl", new FacesMessage("Salvo com sucesso"));
        //RequestContext.getCurrentInstance().update(":formClienteEditar:messages");
        RequestContext.getCurrentInstance().update(":formMsgs:growl");

    }

    public List<ClienteDto> getList()
    {
        return list;
    }

    public void setList(List<ClienteDto> list)
    {
        this.list = list;
    }

    public ClienteDto getCliente()
    {
        return cliente;
    }

    public void setCliente(ClienteDto cliente)
    {
        this.cliente = cliente;
    }
}
